home *** CD-ROM | disk | FTP | other *** search
/ IRIX Base Documentation 2001 May / SGI IRIX Base Documentation 2001 May.iso / usr / share / catman / p_man / cat3 / librw / RWTValMap.z / RWTValMap
Encoding:
Text File  |  1998-10-30  |  21.9 KB  |  529 lines

  1.  
  2.  
  3.  
  4. RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))                                                RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))
  5.  
  6.  
  7.  
  8. NNNNaaaammmmeeee
  9.      RWTValMap<K,T,C> - Rogue Wave library class
  10.  
  11. SSSSyyyynnnnooooppppssssiiiissss
  12.               #include <rw/tvmap.h>
  13.           RWTValMap<K,T,C> m;
  14.  
  15.  
  16.  
  17. SSSSttttaaaannnnddddaaaarrrrdddd CCCC++++++++ LLLLiiiibbbbrrrraaaarrrryyyy DDDDeeeeppppeeeennnnddddeeeennnntttt!!!!
  18.  
  19.  
  20.  
  21.      RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp requires the Standard C++ Library.
  22.  
  23.  
  24. DDDDeeeessssccccrrrriiiippppttttiiiioooonnnn
  25.      This class maintains a collection of keys, each with an associated item
  26.      of type TTTT.  Order is determined by the key according to a comparison
  27.      object of type CCCC.  CCCC must induce a total ordering on elements of type KKKK
  28.      via a public member
  29.         bbbboooooooollll ooooppppeeeerrrraaaattttoooorrrr(((())))((((ccccoooonnnnsssstttt KKKK&&&& xxxx,,,, ccccoooonnnnsssstttt KKKK&&&& yyyy)))) ccccoooonnnnsssstttt which returns ttttrrrruuuueeee if xxxx
  30.      and its partner should precede yyyy and its partner within the collection.
  31.      The structure lllleeeessssssss<<<<TTTT>>>> from the C++-standard header file <<<<ffffuuuunnnnccccttttiiiioooonnnnaaaallll>>>> is
  32.      an example.  RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp<<<<KKKK,,,,TTTT,,,,CCCC>>>> will not accept a key that compares equal
  33.      to any key already in the collection.  (RRRRWWWWTTTTVVVVaaaallllMMMMuuuullllttttiiiiMMMMaaaapppp<<<<KKKK,,,,TTTT,,,,CCCC>>>> may contain
  34.      multiple keys that compare equal to each other.)  Equality is based on
  35.      the comparison object and not on the ======== operator.  Given a comparison
  36.      object ccccoooommmmpppp, keys aaaa and bbbb are equal if
  37.         !!!!ccccoooommmmpppp((((aaaa,,,,bbbb)))) &&&&&&&& !!!!ccccoooommmmpppp((((bbbb,,,,aaaa)))).
  38.  
  39. PPPPeeeerrrrssssiiiisssstttteeeennnncccceeee
  40.      Isomorphic.
  41.  
  42. EEEExxxxaaaammmmpppplllleeeessss
  43.      In this example, a map of RRRRWWWWCCCCSSSSttttrrrriiiinnnnggggs and RRRRWWWWDDDDaaaatttteeees is exercised.
  44.  
  45.               //
  46.  
  47.  
  48.  
  49.               // tvmbday.cpp
  50.           //
  51.           #include <rw/tvmap.h>
  52.           #include <rw/cstring.h>
  53.           #include <rw/rwdate.h>
  54.           #include <iostream.h>
  55.           main(){
  56.             RWTValMap<RWCString, RWDate, less<RWCString> > birthdays;
  57.             birthdays.insert("John", RWDate(12, "April",1975));
  58.             birthdays.insert("Ivan", RWDate(2, "Nov", 1980));
  59.             // Alternative syntax:
  60.  
  61.  
  62.  
  63.                                                                         PPPPaaaaggggeeee 1111
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))                                                RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))
  71.  
  72.  
  73.  
  74.             birthdays["Susan"] = RWDate(30, "June", 1955);
  75.             birthdays["Gene"] = RWDate(5, "Jan", 1981);
  76.             // Print a birthday:
  77.             cout << birthdays["John"] << endl;
  78.             return 0;
  79.           }
  80.           Program Output:
  81.  
  82. RRRReeeellllaaaatttteeeedddd CCCCllllaaaasssssssseeeessss
  83.      04/12/75
  84.  
  85.  
  86.      Class RRRRWWWWTTTTVVVVaaaallllMMMMuuuullllttttiiiiMMMMaaaapppp<<<<KKKK,,,,TTTT,,,,CCCC>>>> offers the same interface to a collection
  87.      that accepts multiple keys that compare equal to each other.
  88.      RRRRWWWWTTTTVVVVaaaallllSSSSeeeetttt<<<<TTTT,,,,CCCC>>>> maintains a collection of keys without the associated
  89.      values.  Class mmmmaaaapppp<<<<KKKK,,,,TTTT,,,,CCCC,,,,aaaallllllllooooccccaaaattttoooorrrr>>>> is the C++-standard collection that
  90.      serves as the underlying implementation for this collection.
  91.  
  92. PPPPuuuubbbblllliiiicccc TTTTyyyyppppeeeeddddeeeeffffssss
  93.               typedef map<K,T,C,allocator>                   container_type;
  94.           typedef container_type::iterator               iterator;
  95.           typedef container_type::const_iterator         const_iterator;
  96.           typedef container_type::size_type              size_type;
  97.           typedef pair <const K,T>                       value_type;
  98.           typedef pair <const K,T>&                      reference;
  99.           typedef const pair <const K,T>&                const_reference;
  100.  
  101.  
  102.  
  103. PPPPuuuubbbblllliiiicccc CCCCoooonnnnssssttttrrrruuuuccccttttoooorrrrssss
  104.               RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp<<<<KKKK,,,,TTTT,,,,CCCC>>>>(const C& comp = C());
  105.  
  106.  
  107.      Constructs an empty map with comparator ccccoooommmmpppp.
  108.  
  109.               RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp<<<<KKKK,,,,TTTT,,,,CCCC>>>>(const container_type& m);
  110.  
  111.  
  112.      Constructs a map by copying all elements of mmmm.
  113.  
  114.               RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp<<<<KKKK,,,,TTTT,,,,CCCC>>>>(const RWTValMap<K,T,C>& rwm);
  115.  
  116.  
  117.      Copy constructor.
  118.  
  119.               RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp<<<<KKKK,,,,TTTT,,,,CCCC>>>>(const value_type* first,
  120.                const value_type* last,const C& comp = C());
  121.  
  122.  
  123.      Constructs a map by copying elements from the array of vvvvaaaalllluuuueeee____ttttyyyyppppeeee pairs
  124.      pointed to by ffffiiiirrrrsssstttt, up to, but not including, the pair pointed to by
  125.  
  126.  
  127.  
  128.  
  129.                                                                         PPPPaaaaggggeeee 2222
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))                                                RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))
  137.  
  138.  
  139.  
  140.      llllaaaasssstttt.
  141.  
  142. PPPPuuuubbbblllliiiicccc MMMMeeeemmmmbbbbeeeerrrr OOOOppppeeeerrrraaaattttoooorrrrssss
  143.               RWTValMap<K,T,C>&
  144.           ooooppppeeeerrrraaaattttoooorrrr====(const RWTValMap<K,T,C>& m);
  145.           RWTValMap<K,T,C>&
  146.           ooooppppeeeerrrraaaattttoooorrrr====(const container_type& m);
  147.  
  148.  
  149.      Destroys all elements of self and replaces them by copying all
  150.      associations from mmmm....
  151.  
  152.               bool
  153.           ooooppppeeeerrrraaaattttoooorrrr<<<<(const RWTValMap<K,T,C>& m) const;
  154.           bool
  155.           ooooppppeeeerrrraaaattttoooorrrr<<<<(const container_type & m) const;
  156.  
  157.  
  158.      Returns ttttrrrruuuueeee if self compares lexicographically less than mmmm, otherwise
  159.      returns ffffaaaallllsssseeee.  Assumes that type KKKK has well-defined less-than semantics
  160.      (TTTT::::::::ooooppppeeeerrrraaaattttoooorrrr<<<<((((ccccoooonnnnsssstttt KKKK&&&&)))) or equivalent).
  161.  
  162.               bool
  163.           ooooppppeeeerrrraaaattttoooorrrr========(const RWTValMap<K,T,C>& m) const;
  164.           bool
  165.           ooooppppeeeerrrraaaattttoooorrrr========(const container_type & m) const;
  166.  
  167.  
  168.      Returns ttttrrrruuuueeee if self compares equal to mmmm, otherwise returns ffffaaaallllsssseeee.  Two
  169.      collections are equal if both have the same number of entries, and
  170.      iterating through both collections produces, in turn, individual pairs
  171.      that compare equal to each other.
  172.  
  173.               T&
  174.           ooooppppeeeerrrraaaattttoooorrrr[[[[]]]](const K& key);
  175.  
  176.  
  177.      Looks up kkkkeeeeyyyy and returns a reference to its associated item.  If the key
  178.      is not in the dictionary, then it will be added with an associated item
  179.      provided by the default constructor for type TTTT.
  180.  
  181. PPPPuuuubbbblllliiiicccc MMMMeeeemmmmbbbbeeeerrrr FFFFuuuunnnnccccttttiiiioooonnnnssss
  182.               void
  183.           aaaappppppppllllyyyy(void (*fn)(const K&, T&, void*),void* d);
  184.           void
  185.           aaaappppppppllllyyyy(void (*fn)(const K&, const T&, void*), void* d) const;
  186.  
  187.  
  188.      Applies the user-defined function pointed to by ffffnnnn to every association
  189.      in the collection.  This function must have one of the prototypes:  vvvvooooiiiidddd
  190.      yyyyoooouuuurrrrffffuuuunnnn((((ccccoooonnnnsssstttt KKKK&&&& kkkkeeeeyyyy,,,, TTTT&&&& aaaa,,,, vvvvooooiiiidddd**** dddd))));;;;
  191.       vvvvooooiiiidddd yyyyoooouuuurrrrffffuuuunnnn((((ccccoooonnnnsssstttt KKKK&&&& kkkkeeeeyyyy,,,, ccccoooonnnnsssstttt TTTT&&&& aaaa,,,,vvvvooooiiiidddd**** dddd))));;;; Client data may be
  192.  
  193.  
  194.  
  195.                                                                         PPPPaaaaggggeeee 3333
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202. RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))                                                RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))
  203.  
  204.  
  205.  
  206.      passed through parameter dddd.
  207.  
  208.               void
  209.           aaaappppppppllllyyyyTTTTooooKKKKeeeeyyyyAAAAnnnnddddVVVVaaaalllluuuueeee(void (*fn)(const K&, T&, void*),void* d);
  210.           void
  211.           aaaappppppppllllyyyyTTTTooooKKKKeeeeyyyyAAAAnnnnddddVVVVaaaalllluuuueeee
  212.           (void (*fn)(const K&, const T&, void*), void* d) const;
  213.  
  214.  
  215.      This is a deprecated version of the aaaappppppppllllyyyy member above.  It behaves
  216.      exactly the same as aaaappppppppllllyyyy....
  217.  
  218.               iterator
  219.           bbbbeeeeggggiiiinnnn();
  220.           const_iterator
  221.           bbbbeeeeggggiiiinnnn() const;
  222.  
  223.  
  224.      Returns an iterator positioned at the first pair in self.
  225.  
  226.               void
  227.           cccclllleeeeaaaarrrr();
  228.  
  229.  
  230.      Clears the collection by removing all items from self.  Each key and its
  231.      associated item will have its destructor called.
  232.  
  233.               bool
  234.           ccccoooonnnnttttaaaaiiiinnnnssss(const K& key) const;
  235.  
  236.  
  237.      Returns ttttrrrruuuueeee if there exists a key jjjj in self that compares equal to kkkkeeeeyyyy,
  238.      otherwise returns ffffaaaallllsssseeee.
  239.  
  240.               bool
  241.           ccccoooonnnnttttaaaaiiiinnnnssss(bool (*fn)(const_reference,void*), void* d) const;
  242.  
  243.  
  244.      Returns ttttrrrruuuueeee if there exists an association a in self such that the
  245.      expression ((((((((****ffffnnnn))))((((aaaa,,,,dddd)))))))) is ttttrrrruuuueeee, otherwise returns ffffaaaallllsssseeee.  ffffnnnn points to a
  246.      user-defined tester function which must have prototype:
  247.  
  248.  
  249.  
  250.  
  251.  
  252.                  bool yourTester(const_reference a, void* d);
  253.  
  254.  
  255.      Client data may be passed through parameter dddd.
  256.  
  257.  
  258.  
  259.  
  260.  
  261.                                                                         PPPPaaaaggggeeee 4444
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))                                                RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))
  269.  
  270.  
  271.  
  272.               iterator
  273.           eeeennnndddd();
  274.           const_iterator
  275.           eeeennnndddd() const;
  276.  
  277.  
  278.      Returns an iterator positioned "just past" the last association in self.
  279.  
  280.               size_type
  281.           eeeennnnttttrrrriiiieeeessss() const;
  282.  
  283.  
  284.      Returns the number of associations in self.
  285.  
  286.               bool
  287.           ffffiiiinnnndddd(const K& key, Key& r) const;
  288.  
  289.  
  290.      If there exists a key jjjj in self that compares equal to kkkkeeeeyyyy, assigns jjjj to
  291.      rrrr and returns ttttrrrruuuueeee.  Otherwise, returns ffffaaaallllsssseeee and leaves the value of rrrr
  292.      unchanged.
  293.  
  294.               bool
  295.           ffffiiiinnnndddd(bool (*fn)(const_reference,void*), void* d,
  296.                pair<K,T>& r) const;
  297.  
  298.  
  299.      If there exists an association aaaa in self such that the expression
  300.      ((((((((****ffffnnnn))))((((aaaa,,,,dddd)))))))) is ttttrrrruuuueeee, assigns aaaa to rrrr and returns ttttrrrruuuueeee.  Otherwise,
  301.      returns ffffaaaallllsssseeee and leaves the value of kkkk unchanged.  ffffnnnn points to a user-
  302.      defined tester function which must have prototype:
  303.  
  304.  
  305.  
  306.  
  307.  
  308.                  bool yourTester(const_reference a, void* d);
  309.  
  310.  
  311.      Client data may be passed through parameter dddd.
  312.  
  313.               bool
  314.           ffffiiiinnnnddddVVVVaaaalllluuuueeee(const K& key, T& r) const;
  315.  
  316.  
  317.      If there exists a key jjjj in self that compares equal to kkkkeeeeyyyy, assigns the
  318.      item associated with jjjj to rrrr and returns ttttrrrruuuueeee.  Otherwise, returns ffffaaaallllsssseeee
  319.      and leaves the value of rrrr unchanged.
  320.  
  321.               bool
  322.           ffffiiiinnnnddddKKKKeeeeyyyyVVVVaaaalllluuuueeee(const K& key, K& kr, T& tr) const;
  323.  
  324.  
  325.  
  326.  
  327.                                                                         PPPPaaaaggggeeee 5555
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334. RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))                                                RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))
  335.  
  336.  
  337.  
  338.      If there exists a key jjjj in self that compares equal to kkkkeeeeyyyy, assigns jjjj to
  339.      kkkkrrrr, assigns the item associated with jjjj to trrrr,,,, and returns ttttrrrruuuueeee.
  340.      Otherwise, returns ffffaaaallllsssseeee and leaves the values of kkkkrrrr and ttttrrrr unchanged.
  341.  
  342.               bool
  343.           iiiinnnnsssseeeerrrrtttt(const K& key, const T& a);
  344.  
  345.  
  346.      Adds kkkkeeeeyyyy with associated item aaaa to the collection.  Returns ttttrrrruuuueeee if the
  347.      insertion is successful, otherwise returns ffffaaaallllsssseeee.  The function will
  348.      return ttttrrrruuuueeee unless the collection already holds an association with the
  349.      equivalent key.
  350.  
  351.               bool
  352.           iiiinnnnsssseeeerrrrttttKKKKeeeeyyyyAAAAnnnnddddVVVVaaaalllluuuueeee(const K& key, const T& a);
  353.  
  354.  
  355.      This is a deprecated version of the iiiinnnnsssseeeerrrrtttt member above.  It behaves
  356.      exactly the same as iiiinnnnsssseeeerrrrtttt.
  357.  
  358.               bool
  359.           iiiissssEEEEmmmmppppttttyyyy() const;
  360.  
  361.  
  362.      Returns ttttrrrruuuueeee if there are no items in the collection, ffffaaaallllsssseeee otherwise.
  363.  
  364.               size_type
  365.           ooooccccccccuuuurrrrrrrreeeennnncccceeeessssOOOOffff(const K& key) const;
  366.  
  367.  
  368.      Returns the number of keys jjjj in self that compare equal to kkkkeeeeyyyy.
  369.  
  370.               size_type
  371.           ooooccccccccuuuurrrrrrrreeeennnncccceeeessssOOOOffff
  372.           (bool (*fn)(const_reference&,void*),void* d) const;
  373.  
  374.  
  375.      Returns the number of associations aaaa in self such that the
  376.      expression((((((((****ffffnnnn))))((((aaaa,,,,dddd)))))))) is ttttrrrruuuueeee.  ffffnnnn points to a user-defined tester
  377.      function which must have prototype:
  378.  
  379.  
  380.  
  381.  
  382.  
  383.                  bool yourTester(const_reference& a, void* d);
  384.  
  385.  
  386.      Client data may be passed through parameter dddd.
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.                                                                         PPPPaaaaggggeeee 6666
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400. RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))                                                RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))
  401.  
  402.  
  403.  
  404.               bool
  405.           rrrreeeemmmmoooovvvveeee(const K& key);
  406.  
  407.  
  408.      Removes the first association with key jjjj in self such that jjjj compares
  409.      equal to kkkkeeeeyyyy and returns ttttrrrruuuueeee.  Returns ffffaaaallllsssseeee if there is no such
  410.      association.
  411.  
  412.               bool
  413.           rrrreeeemmmmoooovvvveeee(bool (*fn)(const_reference,void*), void* d);
  414.  
  415.  
  416.      Removes the first association aaaa in self such that the expression
  417.      ((((((((****ffffnnnn))))((((aaaa,,,,dddd)))))))) is ttttrrrruuuueeee and returns ttttrrrruuuueeee.  Returns ffffaaaallllsssseeee if there is no such
  418.      element.  ffffnnnn points to a user-defined tester function which must have
  419.      prototype:
  420.  
  421.  
  422.  
  423.  
  424.  
  425.                  bool yourTester(const_reference a, void* d);
  426.  
  427.  
  428.      Client data may be passed through parameter dddd.
  429.  
  430.               size_type
  431.           rrrreeeemmmmoooovvvveeeeAAAAllllllll(const K& key);
  432.  
  433.  
  434.      Removes all associations with key j in self such that jjjj compares equal to
  435.      kkkkeeeeyyyy.  Returns the number of items removed.
  436.  
  437.               size_type
  438.           rrrreeeemmmmoooovvvveeeeAAAAllllllll(bool (*fn)(const_reference,void*), void* d);
  439.  
  440.  
  441.      Removes all associations aaaa in self such that the expression
  442.      ((((((((****ffffnnnn))))((((aaaa,,,,dddd))))))))is ttttrrrruuuueeee.  Returns the number of items removed.  ffffnnnn points to
  443.      a user-defined tester function which must have prototype:
  444.  
  445.  
  446.  
  447.  
  448.  
  449.                  bool yourTester(const_reference a, void* d);
  450.  
  451.  
  452.      Client data may be passed through parameter dddd.
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.                                                                         PPPPaaaaggggeeee 7777
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466. RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))                                                RRRRWWWWTTTTVVVVaaaallllMMMMaaaapppp((((3333CCCC++++++++))))
  467.  
  468.  
  469.  
  470.               map<K,T,C,allocator>&
  471.           ssssttttdddd();
  472.           const map<K,T,C,allocator>&
  473.           ssssttttdddd() const;
  474.  
  475.  
  476.      Returns a reference to the underlying C++-standard collection that serves
  477.      as the implementation for self.  This reference may be used freely,
  478.      providing access to the C++-standard interface as well as
  479.      interoperability with other software components that make use of the
  480.      C++-standard collections.
  481.  
  482. RRRReeeellllaaaatttteeeedddd GGGGlllloooobbbbaaaallll OOOOppppeeeerrrraaaattttoooorrrrssss
  483.               RWvostream&
  484.           ooooppppeeeerrrraaaattttoooorrrr<<<<<<<<(RWvostream& strm, const RWTValMap<K,T,C>& coll);
  485.           RWFile&
  486.           ooooppppeeeerrrraaaattttoooorrrr<<<<<<<<(RWFile& strm, const RWTValMap<K,T,C>& coll);
  487.  
  488.  
  489.      Saves the collection ccccoooollllllll onto the output stream ssssttttrrrrmmmm, or a reference to
  490.      it if it has already been saved.
  491.  
  492.               RWvistream&
  493.           ooooppppeeeerrrraaaattttoooorrrr>>>>>>>>(RWvistream& strm, RWTValMap<K,T,C>& coll);
  494.           RWFile&
  495.           ooooppppeeeerrrraaaattttoooorrrr>>>>>>>>(RWFile& strm, RWTValMap<K,T,C>& coll);
  496.  
  497.  
  498.      Restores the contents of the collection ccccoooollllllll from the input stream ssssttttrrrrmmmm.
  499.  
  500.               RWvistream&
  501.           ooooppppeeeerrrraaaattttoooorrrr>>>>>>>>(RWvistream& strm, RWTValMap<K,T,C>*& p);
  502.           RWFile&
  503.           ooooppppeeeerrrraaaattttoooorrrr>>>>>>>>(RWFile& strm, RWTValMap<K,T,C>*& p);
  504.  
  505.  
  506.      Looks at the next object on the input stream ssssttttrrrrmmmm and either creates a
  507.      new collection off the heap and sets pppp to point to it, or sets pppp to point
  508.      to a previously read instance.  If a collection is created off the heap,
  509.      then you are responsible for deleting it.
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.                                                                         PPPPaaaaggggeeee 8888
  526.  
  527.  
  528.  
  529.